package com.lu.pojo.reflection;

/**
 * @author luzhenfang
 * @date 2020 05 25
 * @description  测试类加载和初始化
 * 主动引用(一定发送类的初始化)：
 *      虚拟机启动，先初始化main方法所在的类
 *      new 一个类的对象
 *      调用类的静态成员 除（final 常量) 和静态方法
 *      使用java.lang.reflect 包 进行反射调用
 *      初始化子类会(如果父类没有初始化)先初始化父类
 *  被动引用(不会发送类的初始化)：
 *      访问一个静态域，只有真正声明这个域类才会背初始化(子类调用父类静态变量 不会初始化父类)
 *      通过数组定义类引用 不会触发
 *      引用常量不会触发
 */
public class TestClassLoader {
    public static void main(String[] args) throws ClassNotFoundException {
        System.out.println("Main类加载");
        // 主动调用 当初始化子类时 会 先初始化父类
        // new Son();
        Class.forName("com.lu.pojo.reflection.Son");
        System.out.println("--------------------------");
        // 被动调用
        System.out.println(Son.b);
        System.out.println("--------------------------");

        Son[] sons = new Son[3];
        System.out.println("--------------------------");
        System.out.println(Son.M);

    }
}


class  Father{
    static int b =2;
    static final int M =0;
    static {
        System.out.println("父类被加载");
    }
}


class  Son extends Father{
    static {
        System.out.println("子类被加载");
        m=300;
    }
    static int m =100;
}
